package lc.daily;


import lc.common.TreeNode;

import java.util.List;

/**
 * 2022年5月打卡题目
 */
public interface Y22M05 {

    /**
     * 1305. 两棵二叉搜索树中的所有元素
     * <p>
     * <p>
     * 给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表，其中包含 两棵树 中的所有整数并按 升序 排序。.
     * <br />
     * <br />
     * <b>提示：</b>
     * <ul>
     *     <li>每棵树的节点数在 [0, 5000] 范围内</li>
     *     <li>-10<sup>5</sup> <= Node.val <= 10<sup>5</sup></li>
     * </ul>
     *
     * @param root1
     * @param root2
     * @return
     */
    List<Integer> getAllElements(TreeNode root1, TreeNode root2);

    /**
     * 591. 标签验证器
     * <p>
     * 给定一个表示代码片段的字符串，你需要实现一个验证器来解析这段代码，并返回它是否合法。合法的代码片段需要遵守以下的所有规则：
     * <br />
     * <ol>
     *     <li>代码必须被<b>合法的闭合标签</b>包围。否则，代码是无效的。</li>
     *     <li><b>闭合标签</b>（不一定合法）要严格符合格式：&lt;TAG_NAME&gt;TAG_CONTENT&lt;/TAG_NAME&gt;。其中，&lt;TAG_NAME&gt;是起始标签，&lt;/TAG_NAME&gt;是结束标签。起始和结束标签中的 TAG_NAME 应当相同。当且仅当TAG_NAME 和 TAG_CONTENT 都是合法的，闭合标签才是<b>合法的</b>。</li>
     *     <li>合法的TAG_NAME仅含有大写字母，长度在范围 [1,9] 之间。否则，该TAG_NAME是不合法的。</li>
     *     <li>合法的TAG_CONTENT可以包含其他合法的闭合标签，cdata（请参考规则7）和任意字符（注意参考规则1）除了不匹配的<、不匹配的起始和结束标签、不匹配的或带有不合法 TAG_NAME 的闭合标签。否则，TAG_CONTENT是不合法的。</li>
     *     <li>一个起始标签，如果没有具有相同TAG_NAME 的结束标签与之匹配，是不合法的。反之亦然。不过，你也需要考虑标签嵌套的问题。</li>
     *     <li>一个&lt;，如果你找不到一个后续的&gt;与之匹配，是不合法的。并且当你找到一个&lt;或&lt;/时，所有直到下一个&gt;的前的字符，都应当被解析为TAG_NAME（不一定合法）。</li>
     *     <li>cdata 有如下格式：&lt;![CDATA[CDATA_CONTENT]]&gt;。CDATA_CONTENT的范围被定义成&lt;![CDATA[和后续的第一个]]&gt;之间的字符。</li>
     *     <li>CDATA_CONTENT可以包含<strong>任意字符</strong>。cdata 的功能是阻止验证器解析CDATA_CONTENT，所以即使其中有一些字符可以被解析为标签（无论合法还是不合法），也应该将它们视为常规字符。</li>
     * </ol>
     * <p>
     * <b>合法代码的例子:</b>
     * <ul>
     *     <li>输入: "&lt;DIV&gt;This is the first line &lt;![CDATA[&lt;div&gt;]]&gt;&lt;/DIV&gt;"</li>
     *     <li>输出: True</li>
     *     <li>解释:
     *         <p>代码被包含在了闭合的标签内： &lt;DIV&gt; 和 &lt;/DIV&gt; 。</p>
     *         <p>TAG_NAME 是合法的，TAG_CONTENT 包含了一些字符和 cdata 。</p>
     *         <p>即使 CDATA_CONTENT 含有不匹配的起始标签和不合法的 TAG_NAME，它应该被视为普通的文本，而不是标签。</p>
     *         <p>所以 TAG_CONTENT 是合法的，因此代码是合法的。最终返回True。</p>
     *     </li>
     * </ul>
     * <p>
     * <b>不合法代码的例子:</b>
     * <ul>
     *     <li>输入: "&lt;A&gt;  &lt;B&gt; &lt;/A&gt;   &lt;/B&gt;"</li>
     *     <li>输出: False</li>
     *     <li>解释:
     *         <p>不合法。如果 &quot;&lt;A&gt;&quot; 是闭合的，那么 &quot;&lt;B&gt;&quot; 一定是不匹配的，反之亦然。</p>
     *     </li>
     * </ul>
     * <br />
     * <b>注意:</b>
     * <ul>
     *     <li>为简明起见，你可以假设输入的代码（包括提到的任意字符）只包含数字, 字母, &#x27;&lt;&#x27;,&#x27;&gt;&#x27;,&#x27;/&#x27;,&#x27;!&#x27;,&#x27;[&#x27;,&#x27;]&#x27;和&#x27; &#x27;。</li>
     * </ul>
     * <p>
     * 完整示例看<a href="https://leetcode-cn.com/problems/tag-validator">网页版</a>
     *
     * @param code
     * @return
     */
    boolean isValid(String code);


    /**
     * 442. 数组中重复的数据
     * <p>
     * <p>
     * 给你一个长度为 n 的整数数组 nums ，其中 nums 的所有整数都在范围 [1, n] 内，且每个整数出现 <strong>一次</strong> 或 <strong>两次</strong> 。请你找出所有出现 <strong>两次</strong> 的整数，并以数组形式返回。
     * <p>
     * 你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
     * <p>
     * <strong>提示：</strong>
     * <ul>
     *     <li>n == nums.length</li>
     *     <li>1 <= n <= 10<sup>5</sup></li>
     *     <li>1 <= nums[i] <= n</li>
     *     <li>nums 中的每个元素出现 <strong>一次</strong> 或 <strong>两次</strong></li>
     * </ul>
     *
     * @param nums
     * @return
     */
    List<Integer> findDuplicates(int[] nums);
}
